/* L6 观察者模式(发布者和订阅者相互依赖)
发布者需要知道都有哪些订阅者
每个订阅者提供一个update方法
当事件触发时，发布者将调用每个订阅者的update方法

观察者模式和发布订阅模式的区别在于：
观察者模式的发布者和观察者相互知道对方的存在相互依赖
发布订阅模式有事件中心，解除了发布者和观察者之间的依赖

*/
// 发布者（依赖）
class Dep {
  constructor() {
    // 记录所有订阅者
    this.subs = []; // subscriber
  }
  // 添加订阅者
  addSub(sub) {
    if(sub && sub.update) {
      this.subs.push(sub)
    }
  }
  // 发布通知
  notify() {
    this.subs.forEach(sub => {
      sub.update()
    })
  }
}

// 订阅者（观察者）
class Wather {
  constructor(name) {
    this.name = name
  }
  update() {
    console.log(`${this.name} got update message and do something!`)
  }
}

// 测试
const dep = new Dep()
const wather1 = new Wather('wather1')
dep.addSub(wather1)
const wather2 = new Wather('wather2')
dep.addSub(wather2)
dep.notify()